工控網(wǎng)首頁(yè)
>

應(yīng)用設(shè)計(jì)

>

在S7300/400型PLC中使用高級(jí)語(yǔ)言編程

在S7300/400型PLC中使用高級(jí)語(yǔ)言編程

2005/8/9 10:03:00
S7-SCL是一種類(lèi)似于Pasical、Deliphi的高級(jí)編程語(yǔ)言,其符合國(guó)際標(biāo)準(zhǔn)IEC 61131-3,也就是說(shuō)支持該標(biāo)準(zhǔn)的任意廠家的PLC均可以使用與之相似的語(yǔ)言編程。這種語(yǔ)言適合于處理復(fù)雜的邏輯和大量的數(shù)學(xué)運(yùn)算,由于其具有高級(jí)語(yǔ)言的編程結(jié)構(gòu),因此和S7的STL語(yǔ)句表編程方式比較起來(lái)有著更加方便的控制方式,可以這樣說(shuō),只要是必須使用語(yǔ)句表的地方,我們均可以考慮使用SCL,也許STL在執(zhí)行時(shí)比SCL更加高效,但事實(shí)上也不一定,首先SCL可以編譯成STL,同時(shí)SCL設(shè)計(jì)時(shí)可以?xún)?yōu)化編程,而STL若運(yùn)用不當(dāng),可能還會(huì)將低效率。當(dāng)然在目前的這種系列的PLC上,效率對(duì)于我們來(lái)說(shuō)已是次要的,我們更關(guān)心的是編程結(jié)構(gòu)。就像在PC機(jī)上,舍棄了匯編語(yǔ)言,而主要采用C/C++等高級(jí)語(yǔ)言??傮w來(lái)說(shuō),SCL適合于編寫(xiě)標(biāo)準(zhǔn)功能塊,由于在維護(hù)中,它和STL一樣,不象Lad一樣利于維護(hù),因此這些標(biāo)準(zhǔn)功能塊都應(yīng)該有文檔說(shuō)明,以便用戶(hù)了解其功能。   下面的內(nèi)容主要是參考西門(mén)子的S7-SCL文檔,對(duì)SCL進(jìn)行了系統(tǒng)的介紹,最后給出了示例。   這里假設(shè)讀者是學(xué)過(guò)S7-300/400編程,并曾經(jīng)學(xué)過(guò)至少一種計(jì)算機(jī)高級(jí)編程語(yǔ)言。 一、 軟件的使用 1、 創(chuàng)建一個(gè)新的S7-SCL Source 文件 打開(kāi)工程項(xiàng)目à選擇CPU站à選擇S7 Programà選擇Sources 在右邊窗口的空白處點(diǎn)右鍵選Insert New Objectà點(diǎn)擊SCL Source 雙擊創(chuàng)建的SCL Source文件,進(jìn)入SCL編輯界面。 2、 塊保護(hù) 在SCL Source文件的開(kāi)頭添加關(guān)鍵字:KNOW_HOW_PROTECT,當(dāng)打開(kāi)由其創(chuàng)建的塊時(shí),只能顯示參數(shù),而看不到內(nèi)容。 3、主菜單”Insert”下的”Block Template”可用于插入如OB,FB等各種塊的結(jié)構(gòu)?!盋ontrol Structure”菜單可插入各種流程控制結(jié)構(gòu),這些都可以簡(jiǎn)化編程。 4、在運(yùn)行程序之前,首先必須對(duì)它進(jìn)行編譯,可以編譯整個(gè)Source文件或者某個(gè)被選擇的塊,通過(guò)選擇菜單File > Compile Selected Blocks。也可以把幾個(gè)Source文件一起進(jìn)行編譯,其方法是創(chuàng)建一個(gè)S7-SCL compilation control file.在該文件中依次輸入需要編譯的SCL Source文件名,然后執(zhí)行編譯即可。 二、語(yǔ)法規(guī)則 1、編寫(xiě)SCL Source文件的一般規(guī)則 ● FB, FC, OB, DB以及用戶(hù)定義的UDT,它們使用的任意數(shù)字號(hào)均可以在SCL Source中編輯。 ● 每種塊類(lèi)型都有它自己的結(jié)構(gòu)。 ● 每段落或者每個(gè)變量的聲明以符號(hào)”;”標(biāo)志結(jié)束。 ● 不區(qū)分大小寫(xiě)。 ● 注釋僅存在于程序文檔中,它不影響程序運(yùn)行。 ● 當(dāng)一個(gè)功能塊被調(diào)用時(shí),其背景數(shù)據(jù)塊被自動(dòng)創(chuàng)建,因此它們不需要被編輯。 ● DB0有特定用途,因此在程序中不能創(chuàng)建DB0. 2、 編寫(xiě)塊的先后次序 ● 被調(diào)用的塊必須位于調(diào)用塊之前。 ● UDT的定義必須位于其被使用的位置之前。 ● 共享數(shù)據(jù)塊必須位于那些使用它的所有塊之前。 三、 數(shù)據(jù)類(lèi)型 1、數(shù)據(jù)類(lèi)型預(yù)覽 Ⅰ、基本數(shù)據(jù)類(lèi)型
2、補(bǔ)充 <1>、DATE_AND_TIME Data Type 其值的范圍:DT#1990-01-01-0:0:0.0---------DT#2089-12-31-23:59:59.999 該類(lèi)型以BCD碼形式存儲(chǔ)。
例如20/Oct./1995 12:20:30 and 10 milliseconds顯示如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10 <2>STRING e.g. 聲明 VAR Text1 : String [123]; //該字符串的最大容量為123個(gè)字符 Text2 : String; //該字符串的默認(rèn)容量為254個(gè)字符 END_VAR 初始化:x : STRING[7]:=Address; //在使用STRING前,必須對(duì)它賦值。 FUNCTION Test : STRING[45] VAR_TEMP x : STRING[45]; END_VAR x := a; x := concat (in1 := x, in2 := x); Test := x; //返回值 END_FUNCTION <3>數(shù)組類(lèi)型 e.g. VAR CONTROLLER1 : //聲明3行、4列的二位整數(shù)數(shù)組,并對(duì)其初始化 ARRAY[1..3,1..4] OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ; CONTROLLER2 : ARRAY[1..10] OF REAL ; //聲明10個(gè)數(shù)的一維實(shí)數(shù)數(shù)組 END_VAR 注:數(shù)組的最大維數(shù)為6維,數(shù)組的索引范圍為-32768 --- 32767之間的任意整數(shù)。所有的基本數(shù)據(jù)類(lèi)型均可用于數(shù)組。數(shù)組可以使用變量進(jìn)行索引,例如: arrname_1[ i ] := arrname_2[ j ] ; <4>STRUCT類(lèi)型 e.g. 聲明一個(gè)結(jié)構(gòu)MOTOR中包含另一個(gè)結(jié)構(gòu)DATA。對(duì)結(jié)構(gòu)聲明時(shí),可以初始化元素,也可以在使用之前再初始化。 VAR MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR 結(jié)構(gòu)以WORD的形式結(jié)尾,否則系統(tǒng)自動(dòng)把丟失的字節(jié)補(bǔ)到結(jié)構(gòu)中去。 <5>用戶(hù)定義類(lèi)型UDT (使用關(guān)鍵字TYPE) TYPE //定義名字為MEASVALUES的數(shù)據(jù)類(lèi)型 MEASVALUES: STRUCT BIPOL_1 : INT := 5; BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := W#16#1919 ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA :REAL ; END_STRUCT; END_STRUCT; END_TYPE //在FB10中使用該類(lèi)型 FUNCTION_BLOCK FB10 VAR MEAS_RANGE : MEASVALUES; //創(chuàng)建UDT數(shù)據(jù) END_VAR BEGIN // 使用UDT數(shù)據(jù) MEAS_RANGE.BIPOL_1 := -4 ; MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; END_FUNCTION_BLOCK <6>POINTER類(lèi)型 e.g. //定義功能塊FC100 FUNCTION FC100 : VOID //VOID表明該功能不返回值 VAR_IN_OUT //定義FC100的輸入輸出型參數(shù) N_out : INT; out : POINTER; //定義POINTER型數(shù)據(jù)類(lèi)型,參數(shù)均為臨時(shí)變量 END_VAR VAR_TEMP //定義臨時(shí)變量 ret : INT; END_VAR BEGIN //進(jìn)入函數(shù)主體 // ... ret := SFC79(N := N_out, SA := out); END_FUNCTION //定義功能塊FB100 FUNCTION_BLOCK FB100 VAR //定義靜態(tài)變量,即離開(kāi)塊后仍舊保存狀態(tài)的變量 ii : INT; aa : ARRAY[1..1000] OF REAL; END_VAR BEGIN // ... FC100(N_out := ii, out := aa); //調(diào)用FC100,使用指針的方式傳遞整個(gè)數(shù)組 // ... END_FUNCTION_BLOCK <7>ANY類(lèi)型 e.g. VAR_INPUT //輸入型變量 iANY : ANY; //定義為ANY END_VAR VAR_TEMP pANY : ANY; //定義為ANY END_VAR CASE ii OF //CASE分支語(yǔ)句 1: pANY := MW4; // 將MW4的地址賦給pANY // of MW4 3..5: //等于3,4,5的情況下 pANY:= aINT[ii]; // pANY contains the address // of the ii th // element of the aINT field; 100: pANY := iANY; // pANY contains the value // of the iANY input variable ELSE pANY := NIL; // pANY contains the value // of the NIL pointer END_CASE; SFCxxx(IN := pANY); 四、局部變量和參數(shù)的聲明 1、變量 靜態(tài)變量:用于保持塊的數(shù)據(jù),該數(shù)據(jù)存在背景數(shù)據(jù)塊中。 臨時(shí)變量:僅在塊運(yùn)行過(guò)程中存在。 若多個(gè)變量的數(shù)據(jù)類(lèi)型一致,可用如下方式: VALUE2, VALUE3,VALUE4,....: INT; 聲明時(shí)可以初始化: VALUE :REAL := 20.25; 數(shù)組的初始化有兩種方式: CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := -54, 736, -83, 77; 當(dāng)把相鄰的數(shù)組元素賦相同的值時(shí),例如,把A3[2]到A3[11]的值設(shè)為100.0: A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0; 2、塊參數(shù) 輸入?yún)?shù): 用于接收當(dāng)塊被調(diào)用時(shí)的輸入值,他們是只讀的。 輸出參數(shù): 傳輸當(dāng)前值到這個(gè)調(diào)用塊,在被調(diào)用塊中應(yīng)該對(duì)該參數(shù)賦值 輸入/輸出參數(shù):用于接收當(dāng)塊被調(diào)用時(shí)的輸入值,并可以把結(jié)果返回到調(diào)用塊。 3、使用多重背景 聲明方式如下: Supply1 : FB10; // Supply1為FB10的背景DB Supply2,Supply3,Supply4 : FB100; //為FB100聲明多個(gè)背景DB Motor1 : Motor ; // Motor為某個(gè)FB的符號(hào)名 4、 變量的聲明
五、常量 S7-SCL常量分位常量、數(shù)字常量、字符常量、時(shí)間常量,使用CONST…END_CONST聲明。 e.g. CONST Number := 10 ; //整數(shù)常量 TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; //時(shí)間常量 NAME := SIEMENS ; //字符串常量 NUMBER2 := 2 * 5 + 10 * 4 ; NUMBER3 := 3 + NUMBER2 ; END_CONST 1、 位常量 Bool#false 位的值為T(mén)RUE或者FALSE 8#177777
投訴建議

提交

查看更多評(píng)論